package sun.superstring.demo;

import java.security.SecureRandom;
import java.util.Scanner;

public class CertifyNumberTest3 {
    public static void main(String[] args) {
        // 目标：生成一个指定位数的验证码，每位只能是数字或者大写字母或者小写字母
        // 1.调用一个方法返回指定执行位数的验证码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入验证码位数：");
        int codeLength = sc.nextInt(); // 你可以根据需要更改验证码的长度

//        System.out.println("生成的" + codeLength + "位验证码是：" + certify(codeLength));
        System.out.println("生成的" + codeLength + "位验证码是：" + getCode(codeLength));
    }

    // 方法二：使用switch判断当前位置随机的字符类型
    public static String getCode(int n) {
        // 2.定义一个字符串变量，用于记录生成的验证码
        String code = "";
        // 3.循环n次，每次生成一个验证码
        for (int i = 0; i < n; i++) {
            // 4.为当前位置随机生成一个数字或者大写字母或者小写字母，数字/大写字母/小写字母
            // 随机一个0，1，2，表示当前位置随机字符的类型
            int random = (int) (Math.random() * 3); // [0,1)*3  =====> 0, 1, 2
            // 5.使用switch判断当前位置随机的字符类型
            switch (random) {
                case 0:
                    // 6.使用随机数生成一个0-9的数字，得到一个数字
                    int number = (int) (Math.random() * 10);
                    code += number;
                    break;
                case 1:
                    // 7.使用随机数生成一个0-25的数字，然后加上'A'，得到一个大写字母
                    int number2 = (int)(Math.random() * 26);
                    char letter = (char)(number2 + 'A');
                    code += letter;
                    break;
                case 2:
                    // 8.使用随机数生成一个0-25的数字，然后加上'a'，得到一个小写字母
                    int number3 = (int)(Math.random() * 26);
                    char letter2 = (char) (number3 + 'a');
                    code += letter2;
            }
        }
        return code;
    }




    // 方法一：直接把所有组成的字符列出来，放在string中，然后随机取n字符出来组成一个字符串
    public static String certify(int codeLength) {

        String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        SecureRandom RANDOM = new SecureRandom();

        StringBuilder code = new StringBuilder(codeLength);
        for (int i = 0; i < codeLength; i++) {
            int index = RANDOM.nextInt(CHARACTERS.length());
            code.append(CHARACTERS.charAt(index));
        }
        return code.toString();

    }

}
